#!/usr/bin/env python3
"""
角色和用户初始化脚本
用于初始化系统角色和管理员账户
"""

import sys
import os

# 将项目根目录添加到Python路径中
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from sqlalchemy.orm import Session
from app.config.database import get_db
from app.models.role import Role
from app.models.user import User
from app.models.user_role import UserRole
from app.utils.jwt import get_password_hash
from datetime import datetime

def init_roles_and_users():
    """初始化角色和用户数据"""
    db_gen = get_db()
    db: Session = next(db_gen)
    
    try:
        # 检查是否已存在角色数据
        if db.query(Role).count() > 0:
            print("角色数据已存在，跳过初始化")
            return True
            
        print("开始初始化角色和用户数据...")
        
        # 1. 初始化角色数据
        print("初始化角色数据...")
        roles_data = [
            {"role_code": "ADMIN", "role_name": "系统管理员", "role_desc": "系统最高权限管理员"},
            {"role_code": "EDU_ADMIN", "role_name": "教务管理员", "role_desc": "教务管理核心角色"},
            {"role_code": "TEACHER", "role_name": "教师", "role_desc": "普通教师"},
            {"role_code": "HEAD_TEACHER", "role_name": "班主任", "role_desc": "班级管理负责人"},
            {"role_code": "GRADE_LEADER", "role_name": "年级组长", "role_desc": "年级管理负责人"},
        ]
        
        role_ids = {}
        for role_data in roles_data:
            role = Role(**role_data)
            db.add(role)
            db.flush()  # 获取插入后的ID但不提交事务
            role_ids[role_data["role_code"]] = role.id
        
        # 2. 初始化系统管理员账户
        print("初始化系统管理员账户...")
        # 密码使用bcrypt哈希处理
        admin_password = get_password_hash("admin")
        admin_user = User(
            username="admin",
            password=admin_password,
            real_name="系统管理员",
            phone="13800000000",
            email="admin@myth.edu.cn"
        )
        db.add(admin_user)
        db.flush()
        
        # 3. 关联管理员用户和ADMIN角色
        admin_user_role = UserRole(user_id=admin_user.id, role_id=role_ids["ADMIN"])
        db.add(admin_user_role)
        
        # 4. 初始化教务管理员账户
        print("初始化教务管理员账户...")
        edu_admin_password = get_password_hash("edu123")
        
        edu_admin1 = User(
            username="edu_admin1",
            password=edu_admin_password,
            real_name="教务管理员一",
            phone="13800000001",
            email="edu_admin1@myth.edu.cn"
        )
        db.add(edu_admin1)
        db.flush()
        
        edu_admin2 = User(
            username="edu_admin2",
            password=edu_admin_password,
            real_name="教务管理员二",
            phone="13800000002",
            email="edu_admin2@myth.edu.cn"
        )
        db.add(edu_admin2)
        db.flush()
        
        # 5. 关联教务管理员用户和EDU_ADMIN角色
        edu_admin1_role = UserRole(user_id=edu_admin1.id, role_id=role_ids["EDU_ADMIN"])
        db.add(edu_admin1_role)
        
        edu_admin2_role = UserRole(user_id=edu_admin2.id, role_id=role_ids["EDU_ADMIN"])
        db.add(edu_admin2_role)
        
        db.commit()
        print("角色和用户数据初始化完成！")
        return True
        
    except Exception as e:
        db.rollback()
        print(f"角色和用户数据初始化失败: {e}")
        return False
    finally:
        db.close()

def main():
    """主函数"""
    init_roles_and_users()

if __name__ == "__main__":
    main()